package session;

import entity.Utente;
import entity.Wish;
import java.util.List;
import javax.ejb.Remote;

/**
 * Rappresenta il gestore delle transazioni degli entity Utente.
 *
 * @author Rachid Ouchary, Fabio Strocco, Max Passaghe, Marco Tansini.
 */
@Remote
public interface UtenteFacadeRemote {

    /**
     * Rende persistente un nuovo Utente.
     *
     * @param utente l'utente da rendere persistente.
     */
    public void create(Utente utente);

    /**
     * Aggiorna lo stato dell'utente nel DB allo stato dell'utente passato
     * come parametro.
     *
     * @param utente l'utente da aggiornare.
     */
    public void edit(Utente utente);

    /**
     * Rimuove un utente dal DB.
     *
     * @param utente l'utente da rimuovere.
     */
    public void remove(Utente utente);

    /**
     * Carica l'utente con lo username specificato.
     *
     * @param username lo username dell'utente da caricare.
     * @return l'utente con lo username specificato, <code>null</code> se non esiste nel
     * DB.
     */
    public Utente find(String username);

    /**
     *
     * @return
     */
    public List<Utente> findAll();

    /**
     *
     * @param range
     * @return
     */
    public List<Utente> findRange(int[] range);

    /**
     *
     * @return
     */
    public int count();

    /**
     * Verifica se esiste nel DB l'utente specificato.
     *
     * @param utente l'utente di cui verificare l'esistenza nel DB.
     * @return <code>true</code> se l'utente esiste, <code>false</code>
     * altrimenti.
     */
    public boolean exists(Utente utente);

    /**
     * Carica un utente dal DB solo se esiste un utente nel DB con username
     * e password specificati.
     *
     * @param username lo username dell'utente.
     * @param password la password dell'utente.
     * @return l'utente corrispondente, <code>null</code> se l'utente con
     * username e password specificati non esiste.
     */
    public Utente carica(String username, String password);

     /**
     * Aggiunge un amico all'utente specificato.
     *
     * @param utente username dell'utente.
     * @param amico username dell'amico da aggiungere all'utente specificato.
     */
    public void aggiungiAmico(String utente, String amico);

    /**
     * Cerca tutti i desideri dell'utente specificato ordinati per priorit&agrave.
     *
     * @param username lo username dell'utente.
     * @return la lista dei desideri dell'utente.
     */
    public List<Wish> getOrderedUserWishList(String username);

    /**
     * Cerca gli amici dell'utente con il nome specificato.
     *
     * @param currentUsername Lo username dell'utente corrente.
     * @param username le iniziali dello username degli amici da cercare.
     * @param nome l'iniziale del nome degli amici da cercare.
     * @param cognome l'iniziale del cognome degli amici da cercare.
     * @param email l'iniziale dell'email degli amici da cercare.
     * @param soloAmici indica se cercare solo tra la lista di amici dell'utente corrente.
     * @return la lista di amici trovati.
     */
    public List<Utente> cercaAmici(String currentUsername, String username, String nome,
                                   String cognome, String email,
                                   boolean soloAmici);

    /**
     * Aggiunge un desiderio all'utente. Si assume che l'oggetto desiderato esista
     * gi&agrave nel DB.
     *
     * @param username lo username dell'utente in cui aggiungere il desiderio.
     * @param item_id l'id dell'oggetto desiderato.
     * @param priority la priorit&agrave del desiderio.
     * @param voto il voto del desiderio.
     */
    public boolean aggiungiDesiderio(String username, Long item_id, Integer priority,
                                  Integer voto);
    /**
     * Aggiunge un nuovo desiderio all'utente specificato. L'item desiderato
     * viene creato e memorizzato nel DB se un oggetto equivalente non &egrave
     * presente nel DB.
     *
     * @param username lo username dell'utente in cui aggiungere il desiderio.
     * @param categoria la categoria dell'oggetto desiderato.
     * @param descrizione la descrizione dell'oggetto desiderato.
     * @param proiority la priorit&agrave dell'oggetto desiderato.
     * @param voto il voto dell'oggetto desiderato.
     */
    public boolean creaDesiderio(String username, Long categoryId, String descrizione,
                              Integer proiority, Integer voto);
}
